package manage.modules.rbac.service;

import java.util.List;
import java.util.Map;

import manage.modules.action.model.ActionRange;
import manage.modules.action.model.ActionUri;
import manage.modules.menu.model.MenuFolders;
import manage.modules.rbac.model.ActionOfMenu;
import manage.modules.rbac.model.ActionOfRange;
import manage.modules.rbac.model.ActionOfRole;

/**
 * 权限分配接口
 * 
 * @author dongji
 * @since 2012-9-7 下午12:26:26
 */
public interface RBACService {

	/**
	 * 查询roleid下的所有员工
	 * 
	 * @param roleId
	 * @return
	 */
	List<Map<String, Object>> listWorkerbyRoleId(Integer roleId);

	/**
	 * 查询roleId所有可见菜单
	 * 
	 * @param roleId
	 * @return
	 */
	List<MenuFolders> listMenuByRoleId(Integer roleId);

	/**
	 * 查询worker所有可见菜单
	 * 
	 * @param workerId
	 * @return
	 */
	List<MenuFolders> listMenusByWorkerId(Long workerId);

	/**
	 * 查询worker所有权限（角色之间相同权限没排重,带缓存）
	 * 
	 * @param workerId
	 * @return
	 */
	List<Map<String, Object>> listRBACByWorkerId(Long workerId);

	/**
	 * 根据roleId查询哪些menu可见
	 * 
	 * @param roleId
	 * @return
	 */
	List<Map<String, Object>> listMenuOfRoleByRoleId(Integer roleId);

	/**
	 * 根据menuId查询那些role可见
	 * 
	 * @param menuId
	 * @return
	 */
	List<Map<String, Object>> listMenuOfRoleByMenuId(Integer menuId);

	/**
	 * 菜单下增加操作
	 * 
	 * @param actionOfMenu
	 */
	void menuAddActionUri(ActionOfMenu actionOfMenu);

	/**
	 * 菜单下删除操作
	 * 
	 * @param menuId
	 */
	void deleteActionUriByMenuId(Integer menuId);

	/**
	 * 查询菜单下已有的操作
	 * 
	 * @param menuId
	 * @return
	 */
	List<Map<String, Object>> listActionOfMenuByMenuId(Integer menuId);

	/**
	 * 操作下增加数据范围
	 * 
	 * @param actionOfRange
	 */
	void actionAddActionRange(ActionOfRange actionOfRange);

	/**
	 * 查询action下的数据范围
	 * 
	 * @param rangeId
	 * @return
	 */
	List<Map<String, Object>> listActionOfRangeByActionId(Integer actionId);

	/**
	 * 操作下删除数据范围
	 * 
	 * @param actionId
	 */
	void deleteActionRangeByActionId(Integer actionId);

	/**
	 * 查询角色对应系统权限的列表
	 * 
	 * @param roleId
	 * @return
	 */
	Map<String, Object> listRBACLayoutByRoleId(Integer roleId);

	/**
	 * 所有的权限列表
	 * 
	 * @return
	 */
	Map<String, Object> listRBACLayout();

	/**
	 * 查询所有菜单actionUri
	 * 
	 * @return
	 */
	List<ActionUri> listAllActionUri();

	/**
	 * 查询所有actionRange
	 * 
	 * @return
	 */
	List<ActionRange> listAllActionRange();

	/**
	 * 查询某role可以查看到某menu下的哪些操作
	 * 
	 * @param roleId
	 * @param menuId
	 * @return
	 */
	List<ActionOfMenu> listActionOfMenuByRoleIdAndMenuId(Integer roleId,
			Integer menuId);

	/**
	 * 查询某role可以查看到某操作下的哪些数据范围
	 * 
	 * @param roleId
	 * @param actionId
	 * @return
	 */
	List<ActionOfRange> listActionOfRangeByRoleIdAndActionId(Integer roleId,
			Integer actionId);

	/**
	 * 删除角色某个可见菜单
	 * 
	 * @param menuId
	 * @param roleId
	 */
	boolean deleteMenuOfRole(Integer menuId, Integer roleId);

	/**
	 * 为角色赋予查看某个菜单的权限
	 * 
	 * @param menuId
	 * @param roleId
	 * @return
	 */
	boolean insertMenuOfRole(Integer menuId, Integer roleId);

	/**
	 * 查询某个Role可以看到的所以操作
	 * 
	 * @param roleId
	 * @return
	 */
	List<ActionOfRole> listActionOfRoleByRoleId(Integer roleId);

	/**
	 * 删除角色某个操作
	 * 
	 * @param menuId
	 * @param roleId
	 * @return
	 */
	boolean deleteActionOfRole(Integer actionId, Integer roleId);

	/**
	 * 为角色赋予查看某个操作的权限
	 * 
	 * @param actionId
	 * @param roleId
	 * @param rangeId
	 * @return
	 */
	boolean insertActionOfRole(Integer actionId, Integer roleId, Integer rangeId);

	/**
	 * 验证访问路径权限(可以访问返回true,反之false)
	 * 
	 * @param uri
	 *            访问路径
	 * @param rbac
	 *            所拥有的所有权限列表
	 * @return
	 */
	boolean hasPermissions(String uri, List<Map<String, Object>> rbac);

	/**
	 * 验证访问路径或者验证数据范围的权限(可以访问返回true,反之false)
	 * 
	 * @param uri
	 *            访问路径
	 * @param rbac
	 *            所拥有的所有权限列表
	 * @param rangeValues
	 *            数据范围值，多个请用","隔开
	 * @return
	 */
	boolean hasPermissions(String uri, List<Map<String, Object>> rbac,
			String rangeValues);

	/**
	 * 验证员工是否有权限访问这个路径
	 * 
	 * @param uri
	 * @param workerId
	 * @return
	 */
	boolean hasPermissions(String uri, Long workerId);

	/**
	 * 根据uri获取当前worker拥有对应的那些数据范围
	 * 
	 * @param uri
	 * @param workerId
	 * @return
	 */
	Integer getRangeValue(String uri, Long workerId);

	/**
	 * 获取角色对应action下面拥有的数据范围
	 * 
	 * @param actionId
	 * @param roleId
	 * @return
	 */
	List<Integer> listRangIdByActionAndRole(Integer actionId, Integer roleId);

	/**
	 * 是否存在这条actionOfRole记录
	 * 
	 * @param oldActionOfRole
	 * @return
	 */
	boolean deleteActionOfRole(ActionOfRole actionOfRole);

}
